﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;

namespace Systemet.Domain
{
    class PersonalController
    {
        private SideViews.SideAnstalld empSide;
        private Views.Personalkort empMain;
        private Technical.PersonalConnection pC;
        private List<Personalregister> Employees;
        private List<Personalavdelning> departments;
        private Personalregister Employee;
        private bool isNewEmploy;
       

        //Anropas från SideVyn för att hämta alla anställda och fylla Filtreringskriterierna.
        public List<Personalregister> RetrieveEmployees()
        {
            pC = new Technical.PersonalConnection();
            Employees = pC.RetrieveStaff();
            return Employees;
        }
        public IEnumerable<Personalavdelning> retrieveDepartment()
        {
            pC = new Technical.PersonalConnection();
            departments = pC.retrievStaffdepartment("");
            return departments;
        }
        //Returnerar en lista av anställda till main för att sedan uppdatera dgvn
        public object updateMainDgv(string avd, string pNamn, string PersNr)
        { 
             pC = new Technical.PersonalConnection();
             object stafflist = pC.FilterStaffForDgv(avd, pNamn, PersNr);
             return stafflist;
        }

        public List<Personalavdelning> OnDgvClick(string persNr)
        {
            pC = new Technical.PersonalConnection();
            IEnumerable<Personalavdelning> allokeringar = pC.retrievStaffdepartment(persNr);
            return allokeringar.ToList();
        }

        public bool ValidateNewEmployee(string persNr,string pNr, string fnamn, string enamn, string lön, string sysGrad, string vakAvdr, string årsArb, string adm, string förMark, string drift, string utvFörv)
        {
            
            bool validated = true;
            int number;
            DateTime dateCheck;
            if (!DateTime.TryParseExact(persNr, "yyMMdd",CultureInfo.CurrentUICulture,DateTimeStyles.AssumeLocal, out dateCheck) || persNr.Length < 6)
            {
                return false;
            }
            if (!Int32.TryParse(pNr, out number) || pNr.Length < 4)
            {
                return false;
            }
            if (fnamn.Length < 2)
            {
                return false;
            }
            if (enamn.Length < 2)
            {
                return false;
            }

            if (!Int32.TryParse(lön, out number))
            {
                return false;
            }
            if (!Int32.TryParse(sysGrad, out number) && number < 25 || number > 100)
            {
                return false;
            }
            if (!Int32.TryParse(vakAvdr, out number) && number < 25 || number > 100)
            {
                return false;
            }
            if (!Int32.TryParse(årsArb, out number))
            {
                return false;
            }
            if (adm != "")
            {
                if (!Int32.TryParse(adm, out number) || ((adm.StartsWith("0")) && adm.Length > 1))
                {
                    return false;
                }
            }
            if (förMark != "")
            {
                if (!Int32.TryParse(förMark, out number) || ((förMark.StartsWith("0")) && förMark.Length > 1))
                {
                    return false;
                }
            }
            if(drift != "")
            {
                if (!Int32.TryParse(drift, out number) || ((drift.StartsWith("0")) && drift.Length > 1))
                {
                    return false;
                }
            }
            if (utvFörv != "")
            {
                if (!Int32.TryParse(utvFörv, out number) || ((utvFörv.StartsWith("0")) && utvFörv.Length > 1))
                {
                    return false;
                }
            }
            if (förMark == "") förMark = "0";
            if (drift == "") drift = "0";
            if (utvFörv == "") utvFörv = "0";
            if (adm == "") adm = "0";
            empMain = (Views.Personalkort)AccessController.Instance.MainView;
            empMain.uppdateradisponibelt(int.Parse(årsArb), int.Parse(adm), int.Parse(utvFörv), int.Parse(drift), int.Parse(förMark));
            if (validated)
            {
                
                
                int Sum = int.Parse(adm) + int.Parse(utvFörv) + int.Parse(drift) + int.Parse(förMark);
                
                if (Sum > 100 || Sum < 5 || Sum > (int.Parse(sysGrad) - int.Parse(vakAvdr)))
                {
                    validated = false;
                }
            }
            return validated;
        }

        public void CreateEmployeeObject(string persNr, string fnamn, string enamn, string lön, string sysGrad, string vakAvdr, string adm, string förMark, string drif, string utvFörv, bool newEmployee)
        {
            if (förMark == "") förMark = "0";
            if (drif == "") drif = "0";
            if (utvFörv == "") utvFörv = "0";
            if (adm == "") adm = "0";
            isNewEmploy = newEmployee;

            Employee = new Personalregister();
            Employee.Fnamn = fnamn;
            Employee.Enamn = enamn;
            Employee.personnummer = persNr;
            Employee.Månadslön = lön;
            Employee.Sysselsättningsgrad = int.Parse(sysGrad);
            Employee.Vakansavdrag = int.Parse(vakAvdr);
            Employee.rollID = 11; //Allmän inloggning
            Employee.andratDatum = DateTime.Now;
            Employee.signatur = AccessController.Instance.LoggedInUser.UserName;         
            departments = new List<Personalavdelning>();
            departments.Clear();

            int admin = int.Parse(adm);
            int FörsMark = int.Parse(förMark);
            int drift = int.Parse(drif);
            int utveckFör = int.Parse(utvFörv);

            if (admin > 0)
            {
                Personalavdelning pA = new Personalavdelning();
                pA.personnummer = persNr;
                pA.avdelningsnamn = "Adm";
                pA.procentsats = admin;
               
                departments.Add(pA);
            }
            if (FörsMark > 0)
            {
                Personalavdelning pA = new Personalavdelning();
                pA.personnummer = persNr;
                pA.avdelningsnamn = "För/mark";
                pA.procentsats = FörsMark;
                departments.Add(pA);
            }
            if (drift > 0)
            {
                Personalavdelning pA = new Personalavdelning();
                pA.personnummer = persNr;
                pA.avdelningsnamn = "Drift";
                pA.procentsats = drift;
                departments.Add(pA);
            }
            if (utveckFör > 0)
            {
                Personalavdelning pA = new Personalavdelning();
                pA.personnummer = persNr;
                pA.avdelningsnamn = "Utv/Förv";
                pA.procentsats = utveckFör;
                departments.Add(pA);
            }
            RegisterEmployee(Employee, departments);
            
        }
        private void RegisterEmployee(Personalregister employee, List<Personalavdelning> allocations)
        {
           pC = new Technical.PersonalConnection();

           if (!isNewEmploy)
           {

               pC.RemoveStaffAllocations(employee.personnummer);
           }
            
          bool Isregistered = pC.validatePersonal(employee, isNewEmploy);

          if (!Isregistered)
          {
              //Trolla bort, bör utföras i GUI
              MessageBox.Show("Personnummer är redan registrerat", "Varning", MessageBoxButtons.OK, MessageBoxIcon.Error);
          }
          else
          {

              bool IsAllocated = pC.RegisterAllocations(allocations, isNewEmploy);



              if (Isregistered && !IsAllocated)
              {
                  MessageBox.Show("Ogiltig allokering", "Varning", MessageBoxButtons.OK, MessageBoxIcon.Error);
              }

              if (IsAllocated || Isregistered)
              {
                  //empMain = (Views.Personalkort)AccessController.Instance.MainView;
                  //empMain.updateDgv("", "", employee.personnummer);
              }
          }
        }
        // Kollar om Syselstättningsgrad eller Vakansavdrag är mindre än 25 eller större än 100
        public bool TrySysVakans(string sysVak)
        {
            int number;
            if (Int32.TryParse(sysVak, out number) && number != 0)
            {
                if (Int32.TryParse(sysVak, out number) && number < 25 || number > 100)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            else
            {
                return true;
            }
        
        }
        public bool TryPersnr(string persNr)
        {
            DateTime dateCheck;
            if (!DateTime.TryParseExact(persNr, "yyMMdd", CultureInfo.CurrentUICulture, DateTimeStyles.AssumeLocal, out dateCheck))
            {
                return false;
            }
            else
            {
                return true;
            }

        }
        public void ClearTb()
        {
            empMain = (Views.Personalkort)AccessController.Instance.MainView;
            empMain.ClearTB();
        }

    }

}
